/*
 * Copyright (C), 2002-2017, 你的兔宝宝电子商务有限公司
 * FileName: SqlFreeMarkerParser.java
 * Author:   你的兔宝宝
 * Date:     2017-6-5 下午9:45:27
 * Description: sql语句freemarker解析//模块目的、功能描述      
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.baby.demo.utils.dal;

import java.io.IOException;
import java.io.StringReader;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;

import com.baby.demo.utils.Strings;

import freemarker.template.Configuration;
import freemarker.template.SimpleHash;
import freemarker.template.Template;
import freemarker.template.TemplateModelException;

/**
 * sql语句freemarker解析<br> 
 * 〈功能详细描述〉
 *
 * @author 你的兔宝宝
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class SqlFreeMarkerParser {
    
    private static Logger logger = LoggerFactory.getLogger(SqlFreeMarkerParser.class);
    
    private final static Configuration CONF = new Configuration();
    
    static Map<String, Object> variables;
    
    static{
        CONF.setClassicCompatible(true);
    }
    /**
     * 配置SQL表达式缓存
     */
    private static ConcurrentHashMap<String, Template> sqlCache = new ConcurrentHashMap<String, Template>();
    
    /**
     * 
     * 功能描述: 解析生成sql<br>
     * 〈功能详细描述〉
     *
     * @param sqlId
     * @param sqlContent
     * @param params
     * @return
     * @Author:   你的兔宝宝
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static String parse(String sqlId,String sqlContent,Map<String,Object> params){
        String sql = Strings.EMPTY;
        Template tpl = null;
        // 解析缓存sql
        if( !sqlCache.contains(sqlId) ){
            try {
                tpl = new Template(sqlId, new StringReader(sqlContent), CONF);
                sqlCache.putIfAbsent(sqlId, tpl);
            } catch (IOException e) {
                throw new DalException( "[无缓存]处理sql异常["+sqlId+"]["+params+"]["+sqlContent+"]", e);
            }
        }else{
            tpl = sqlCache.get(sqlId);
        }
        try {
            sql = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, params);
        } catch (Exception e) {
            throw new DalException( "生成sql异常["+sqlId+"]["+params+"]["+sqlContent+"]", e);
        }
        return sql;
    }
    
    /**
     * 
     * 功能描述: 注册环境变量<br>
     * 〈功能详细描述〉
     *
     * @param variables
     * @Author:   你的兔宝宝
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static void registerVariables(Map<String, Object> variables) {
        try {
            CONF.setAllSharedVariables(new SimpleHash(variables, CONF.getObjectWrapper()));
        } catch (TemplateModelException e) {
            logger.error("注册sqlFreeMarker-解析环境变量失败", e);
        }
    }
    
    /**
     * 
     * 功能描述: 注册环境变量<br>
     * 〈功能详细描述〉
     *
     * @Author:   你的兔宝宝
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static void register() {
        registerVariables(variables);
    }
    

    /**
     * @return the variables
     */
    public Map<String, Object> getVariables() {
        return variables;
    }

    /**
     * @param variables the variables to set
     */
    public void setVariables(Map<String, Object> variables) {
        SqlFreeMarkerParser.variables = variables;
    }
    
}
